/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package br.com.naotebuk.controller;

import br.com.naotebuk.dao.ClienteDao;
import br.com.naotebuk.modelo.Cidade;
import br.com.naotebuk.modelo.Cliente;
import br.com.naotebuk.modelo.Endereco;
import br.com.naotebuk.modelo.Estado;
import br.com.naotebuk.modelo.Usuario;
import br.com.naotebuk.propertyEditor.CidadePropertyEditor;
import br.com.naotebuk.propertyEditor.EnderecoPropertyEditor;
import br.com.naotebuk.propertyEditor.EstadoPropertyEditor;
import java.util.List;
import javax.servlet.http.HttpServletRequest;
import javax.validation.Valid;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.ui.Model;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.ServletRequestDataBinder;
import org.springframework.web.bind.annotation.InitBinder;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.servlet.mvc.support.RedirectAttributes;

/**
 *
 * @author Amrc
 */
@Transactional
@Controller
public class ClienteController {

    @Autowired
    private ClienteDao dao;

    @InitBinder
    protected void initBinder(HttpServletRequest request, ServletRequestDataBinder binder) throws Exception {
        binder.registerCustomEditor(Endereco.class, new EnderecoPropertyEditor(dao));
        binder.registerCustomEditor(Cidade.class, new CidadePropertyEditor(dao));
        binder.registerCustomEditor(Estado.class, new EstadoPropertyEditor(dao));
    }

    @RequestMapping("novoCliente")
    public String form(Cliente cliente, Model model) {

        model.addAttribute("estados", dao.listaEstados());
        return "cliente/formulario";
    }

    @RequestMapping("adicionaCliente")
    public String adiciona(@Valid Cliente cliente, BindingResult result, final RedirectAttributes redirectAttributes, HttpServletRequest request) {
          Usuario usuario = (Usuario)request.getSession().getAttribute("usuarioLogado");
//        if (result.hasFieldErrors("email")) {
//            return "cliente/formulario";
//        }

        dao.adiciona(cliente);
        redirectAttributes.addFlashAttribute("sucesso", "true");
        redirectAttributes.addFlashAttribute("mensagem", "Cliente incluído com sucesso!");
        
        if(usuario.getCargo().getNome().equals("Gerente")){
                    return "redirect:listaClientes";
        }else{
            return "redirect:inicio";
        }

    }
    
    @RequestMapping("alteraCliente")
    public String altera(Cliente cliente, BindingResult result, final RedirectAttributes redirectAttributes) {
        dao.altera(cliente);
        redirectAttributes.addFlashAttribute("sucesso", "true");
        redirectAttributes.addFlashAttribute("mensagem", "Cliente alterado com sucesso!");

        return "redirect:listaClientes";
    }

    @RequestMapping("buscaClientePorNome")
    public String listaComFiltro(String nome, Model model) {
        List<Cliente> clientes = dao.buscarPorNome(nome);
        model.addAttribute("clientes", clientes);

        return "cliente/lista";
    }

    @RequestMapping("buscaClientePorCpf")
    public String listaPorCpf(Cliente cliente, final RedirectAttributes redirectAttributes) {
        try {
            redirectAttributes.addFlashAttribute("cliente", dao.buscaPorCpf(cliente.getCpf()));
        } catch(RuntimeException e){
            redirectAttributes.addFlashAttribute("erroBusca", true);
            redirectAttributes.addFlashAttribute("mensagem", "Nenhum Cliente encontrado! Favor realizar nova busca!");
        }finally{
            return "redirect:novoPedido";
        }
    }

    @RequestMapping("listaClientes")
    public String lista(Model model) {
        List<Cliente> clientes = dao.lista();

        model.addAttribute("clientes", clientes);

        return "cliente/lista";
    }

    @RequestMapping("removeCliente")
    public String remove(Integer id, final RedirectAttributes redirectAttributes) {
        dao.remove(dao.buscaPorId(id));
        redirectAttributes.addFlashAttribute("sucesso", "true");
        redirectAttributes.addFlashAttribute("mensagem", "Cliente removido com sucesso!");
        return "redirect:listaClientes";
    }

    @RequestMapping("mostraCliente")
    public String mostra(Integer id, Model model) {
        Cliente cliente = dao.buscaPorId(id);
        model.addAttribute("estados", dao.listaEstados());
        model.addAttribute("cidades", dao.cidadesPorEstado(
                                cliente.getEndereco()
                                .getCidade()
                                .getEstado())
                            );
        model.addAttribute("cliente", cliente);
        return "cliente/mostra";
    }

    @RequestMapping("listarCidades")
    public String cidadeList(@RequestParam(value = "idEstado") Estado estado, Model model) {
        model.addAttribute("cidades", dao.cidadesPorEstado(estado));
        return "cliente/dropDownListCidades";
    }
}
